package com.chenliwu.demo.collection.list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * ArrayList排序
 *
 * @author chenliwu
 * @since 2023-06-11
 */
public class ArrayLisSortDemo {

    public static void main(String[] args) {
        // test_comparable();
        // test_comparator();
        // test_stream_sort();

        test_stream_sort_null_field();
    }

    private static void test_stream_sort_null_field() {
        // 创建并初始化 List
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 10, "西安"));
            add(new Person(3, 40, "上海"));
            add(new Person(4, null, "上海"));
        }};

        // 按照[年龄]正序,但年龄中有一个 null 值
        // Comparator.nullsFirst 表示将排序字段中的 null 值放到集合最前面。
        // 如果想要将 null 值放到集合最后面可以使用 Comparator.nullsLast。
        list = list.stream().sorted(Comparator.comparing(Person::getAge,
                Comparator.nullsFirst(Integer::compareTo)))
                .collect(Collectors.toList());

        // 打印 list 集合
        list.forEach(p -> {
            System.out.println(p);
        });
    }

    /**
     * 使用 Stream 流排序
     */
    private static void test_stream_sort() {
        // 创建并初始化 List
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};
        // 使用 Stream 排序
        //  reversed() 表示倒序的意思，如果不使用此方法则是正序。
        list = list.stream().sorted(Comparator.comparing(Person::getAge).reversed())
                .collect(Collectors.toList());

        // 打印 list 集合
        list.forEach(p -> {
            System.out.println(p);
        });
    }

    private static void test_comparator() {
        // 创建并初始化 List
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};
        // 使用 Comparator 比较器排序
        Collections.sort(list, new PersonComparator());
        // 打印 list 集合
        list.forEach(p -> {
            System.out.println(p);
        });
    }

    /**
     * 新建 Person 比较器
     */
    static class PersonComparator implements Comparator<Person> {
        @Override
        public int compare(Person p1, Person p2) {
            return p2.getAge() - p1.getAge();
        }
    }

    /**
     * 使用 Comparable 排序
     */
    private static void test_comparable() {
        // 创建并初始化 List
        List<Person> list = new ArrayList<Person>() {{
            add(new Person(1, 30, "北京"));
            add(new Person(2, 20, "西安"));
            add(new Person(3, 40, "上海"));
        }};
        // 使用 Comparable 自定的规则进行排序
        Collections.sort(list);
        // 打印 list 集合
        for (Person person : list) {
            System.out.println(person);
        }
    }

}

class Person implements Comparable<Person> {
    private Integer id;
    private Integer age;
    private String name;

    public Person(Integer id, Integer age, String name) {
        this.id = id;
        this.age = age;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Person p) {
        return p.getAge() - this.getAge();
    }
}
